package jsave.action;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

import jsave.conf.Configurations;
import jsave.exception.JSaveArretSauvegarde;
import jsave.util.Conversion;
import jsave.util.Utilitaire;

import org.apache.log4j.Logger;

public class ActionDemander extends Action {

	private static final Logger log = Logger.getLogger(ActionDemander.class);
	

	public ActionDemander(int typeAction) {
		
		super();
		
		if (typeAction == Action.ACTION_A || typeAction == Action.ACTION_B || typeAction == Action.ACTION_C || typeAction == Action.ACTION_D) {
			this.typeAction = typeAction;
		} else {
			log.error("ERREUR - Le type d'action '"+typeAction+"' ne correspond pas a l'action 'ActionDemander' ");
		}
	}
	
	
	public void executer(File s, File d) throws JSaveArretSauvegarde {
		
		if (typeAction == ACTION_A) {
			
			System.out.println("Le fichier existe dans la source mais pas dans la destination.");
			System.out.println("  Fichier : "+s.getPath());
			System.out.print("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : ");
			BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
			Configurations.getInstance().getConfigCourante().getChrono().pause();
			
			String reponse = null;
			try {
				reponse = entree.readLine();
			} catch(Exception e) {
				log.error(e.getMessage(), e);
				System.exit(1);
			}
			
			Configurations.getInstance().getConfigCourante().getChrono().reprendre();
			if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
				throw new JSaveArretSauvegarde();
			}
			if (reponse.endsWith("c") || reponse.endsWith("COPIER")) {
				if (s.isDirectory())
					creerDossier(d);
				else
					ajouterFichier(s,d);
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
				    Configurations.getInstance().getConfigCourante().setActionA(new ActionCopier(ACTION_A));
				}
				
				return;
			}
			if (reponse.endsWith("s") || reponse.endsWith("SUPPRIMER")) {
				if (s.isDirectory())
					supprimerDossier(s);
				else {
					supprimerFichier(s);
				}
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionA(new ActionSupprimer(ACTION_A));
				}
				
				return;
			}
			// Cas par defaut : ignorer
			log.info("IG - "+s.getPath()+" [A]");
			if (s.isDirectory()) {
				nbDossiersIgnores++;
			} else {
				nbFichiersIgnores++;
			}
			
			// Toujours pareil pour la suite 
			if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
				Configurations.getInstance().getConfigCourante().setActionA(new ActionIgnorer(ACTION_A));
			}
			
		} else if (typeAction == ACTION_B) {
			
			System.out.println("Le fichier existe dans la destination mais pas dans la source.");
			System.out.println("  Fichier : "+d.getPath());
			System.out.print("? [TOUS] IGNORER, COPIER, SUPPRIMER ou ARRET ([t] i, c, s ou a) : ");
			BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
			Configurations.getInstance().getConfigCourante().getChrono().pause();

			String reponse = null;
			try {
				reponse = entree.readLine();
			} catch(Exception e) {
				log.error(e.getMessage(), e);
				System.exit(1);
			}
			
			Configurations.getInstance().getConfigCourante().getChrono().reprendre();
			
			if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
				throw new JSaveArretSauvegarde();
			}
			if (reponse.endsWith("c") || reponse.endsWith("COPIER")) {
				if (d.isDirectory())
					creerDossier(s);
				else
					ajouterFichier(d,s);
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionB(new ActionCopier(ACTION_B));
				}
				
				return;
			}
			if (reponse.endsWith("s") || reponse.endsWith("SUPPRIMER")) {
				
				System.out.println("%% DEB : Suppression de "+d.getPath());
				
				if (d.isDirectory())
					supprimerDossier(d);
				else {
					supprimerFichier(d);
				}
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionB(new ActionSupprimer(ACTION_B));
				}
				
				return;
			}
			// Cas par defaut : ignorer
			log.info("IG - "+d.getPath()+" [B]");
			if (s.isDirectory()) {
				nbDossiersIgnores++;
			} else {
				nbFichiersIgnores++;
			}
			
			// Toujours pareil pour la suite 
			if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
				Configurations.getInstance().getConfigCourante().setActionB(new ActionIgnorer(ACTION_B));
			}
				
		} else if (typeAction == ACTION_C) {
			
			System.out.println("Le fichier existe dans la source et dans la destination mais la source est plus recente.");
			System.out.println("  Fichier     : "+s.getPath());	
			System.out.println("  Source      : "+Conversion.tailleOctets2String(s.length())+"\tmodifie le "+Utilitaire.getDateTemps(s.lastModified()));
			System.out.println("  Destination : "+Conversion.tailleOctets2String(d.length())+"\tmodifie le "+Utilitaire.getDateTemps(d.lastModified()));
			System.out.print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : ");
			BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
			Configurations.getInstance().getConfigCourante().getChrono().pause();

			String reponse = null;
			try {
				reponse = entree.readLine();
			} catch(Exception e) {
				log.error(e.getMessage(), e);
				System.exit(1);
			}
			
			Configurations.getInstance().getConfigCourante().getChrono().reprendre();
			if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
				throw new JSaveArretSauvegarde();
			}
			if (reponse.endsWith("ms") || reponse.endsWith("MAJS")) {
				log.info("MS - "+s.getPath());
				MAJFichier(d,s);
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionC(new ActionMAJSource(ACTION_C));
				}
				
				return;
			}
			if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
				log.info("MD - "+d.getPath());
				MAJFichier(s,d);
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionC(new ActionMAJDestination(ACTION_C));
				}
				
				return;
			}
			// Par defaut : ignorer
			log.info("IG - "+s.getPath()+" [C]");
			nbFichiersIgnores++;
							
			// Toujours pareil pour la suite 
			if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
				Configurations.getInstance().getConfigCourante().setActionC(new ActionIgnorer(ACTION_C));
			}
				
		} else /* ACTION_D */{
			
			System.out.println("Le fichier existe dans la source et dans la destination mais la destination est plus recente.");
			System.out.println("  Fichier      : "+s.getPath());	
			System.out.println("  Source       : "+Conversion.tailleOctets2String(s.length())+"\tmodifie le "+Utilitaire.getDateTemps(s.lastModified()));
			System.out.println("  Destination  : "+Conversion.tailleOctets2String(d.length())+"\tmodifie le "+Utilitaire.getDateTemps(d.lastModified()));
			System.out.print("? [TOUS] IGNORER, MAJS, MAJD ou ARRET ([t] i, ms, md ou a) : ");
			BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));
			Configurations.getInstance().getConfigCourante().getChrono().pause();

			String reponse = null;
			try {
				reponse = entree.readLine();
			} catch(Exception e) {
				log.error(e.getMessage(), e);
				System.exit(1);
			}
			
			Configurations.getInstance().getConfigCourante().getChrono().reprendre();
			if (reponse.endsWith("a") || reponse.endsWith("ARRET")) {
				throw new JSaveArretSauvegarde();
			}
			if (reponse.endsWith("ms") || reponse.endsWith("MAJS")) {
				log.info("MS - "+s.getPath());
				MAJFichier(d,s);
							
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionD(new ActionMAJSource(ACTION_D));
				}
			
				return;
			}
			if (reponse.endsWith("md") || reponse.endsWith("MAJD")) {
				log.info("MD - "+d.getPath());
				MAJFichier(s,d);
				
				// Toujours pareil pour la suite 
				if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
					Configurations.getInstance().getConfigCourante().setActionD(new ActionMAJDestination(ACTION_D));
				}
			
				return;
			}
			// cas par defaut : ignorer
			log.info("IG - "+d.getPath()+" [D]");
			nbFichiersIgnores++;
			
			// Toujours pareil pour la suite 
			if (reponse.startsWith("t") || reponse.startsWith("TOUS")) {
				Configurations.getInstance().getConfigCourante().setActionD(new ActionIgnorer(ACTION_D));
			}
		}
	}

	public String getNom() {
		return "DEMANDER";
	}
}
